package com.gjt.http;


import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;
import java.util.Date;

/**
 * Created with Intel IDEA.
 *  URLConnection的配置连接
 *                  七个保护字段，定义了客户端如何向服务器做出请求。保护字段为
 *                      Protected URL url; Protected boolean doInput =true; Protected boolean doOutput =false;
 *                      Protected boolean allowUserInteraction = defaultAllowUserInteraction;
 *                      Protected boolean userCaches = defaultUseCaches;
 *                      Protected boolean isModifiedSince = 0;
 *                      Protected boolean connected = false;（set,get都没有）
 *
 *                      URL字段只有get 方法 没有set 其他都有；并且只能在 URLConnection 连接之前修改这个字段
 *
 *                   URLConnection 实例的默认行为：
 *                              public boolean getDefaultUseCaches();
 *                              public void setDefaultUseCaches(boolean defaultUseCaches)
 *                              public static void setDefaultAllowUserInteraction(boolean defaultAllowUserInteraction )
 *                              public static boolean getDefaultAllowUserInteraction();
 *                              public static FileNameMap getFileNameMap()
 *                              public static void setFileNameMap(FileNameMap map)
 *                      可以在任何时候调用
 *
 *                    connected 字段表示如果连接打开就为true,关闭false，没有直接读取或者改变这个字段的方法，不过任何导致URLConnection连接的方法都会
 *                    将这个变量设置为true( connect(),getInputStream(),getOutputStream())
 *
 *
 * @Auther: gjt
 * @Date: 2024/3/27 22:02
 */
public class UCconfiguration {

    /**
     * 从URLConnection 中获取URL
     */
    public static void getUrl(){
        try{
            URL url = new URL("http://www.gjt1314.xyz");
            URLConnection urlConnection = url.openConnection();
            System.out.println(urlConnection.getURL());

        }catch (IOException e){e.printStackTrace();}
    }

    /**
     * 从URLConnection 中设置是否可以与用户交互
     */
    public static void get(){
        try{
            URL url = new URL("http://www.gjt1314.xyz");
            URLConnection urlConnection = url.openConnection();

            // 表示可以与用户交互
            urlConnection.setAllowUserInteraction(true);

            // 如果服务器允许读取则会返回true ：让服务器默认是可以读取的
            if(!urlConnection.getDoInput()){
                urlConnection.setDoInput(true);
            }

            // 如果服务器允许写入则会返回true ：让服务器默认是可以写入的（这样的话 就由get 改变成post）
            if(!urlConnection.getDoOutput()){
                urlConnection.setDoOutput(true);
            }
            System.out.println(urlConnection.getURL());

        }catch (IOException e){e.printStackTrace();}
    }


    public static void main(String[] args) {
        getUrl();

        // 用当前时间初始化Date对象
        Date date = new Date();
        long millisecondsPerDay = 24 * 60 * 60 * 1000;

        for (int i = 0; i < args.length; i++) {
          try{
              URL url = new URL(args[i]);
              URLConnection urlConnection = url.openConnection();

              /**
               *  isModifiedSince：如果缓存中有数据，直接获取，不过在最后一次获取这个文档时服务器的文档可能改变，如果在这个时间后改变了，服务器就发送此文档
               */
              // 打印默认值
              System.out.println("Original if modified since" + new Date(urlConnection.getIfModifiedSince()));

              // 设置此值为24小时之前
              urlConnection.setIfModifiedSince((new Date(date.getTime() - millisecondsPerDay)).getTime());

              System.out.println("Will retrieve file if it's modified since" + new Date(urlConnection.getIfModifiedSince()));

              /**
               *  useCache 变量可以确定是否开启缓存，默认true; false 禁用缓存，确保总会获取文档的最新版本
               */
              urlConnection.setUseCaches(false);


              /**
               * 希望缓存的URLConnection 必须使用setUseCaches(true)显示开启缓存
               */
              if(urlConnection.getDefaultUseCaches()){
                  urlConnection.setDefaultUseCaches(false);
              }


              /**
               *  超时（查询和修改连接的超时）
               *
               *  public void  setConnectionTimeout(int long)
               *  public int getConnectionTimeout()
               *  这两方法控制socket 等待建立连接的时间
               *
               *  public void setReadTimeout(int long)
               *  public int getReadTimeout()
               *  控制输入流等待数据到达的时间
               *
               *  方法都是毫秒级别（0 表示永远不会超时）
               */

              urlConnection.setConnectTimeout(30000);
              urlConnection.getReadTimeout();

          }catch (IOException e){
              e.printStackTrace();
          }

        }
    }
}
